package com.learning.thread.base.threadlocal;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * ClassName: CustomThread
 * Description: 线程范围内共享变量: 各对象实例(A / B)在某个线程范围内的数据是一致的
 * 验证单个线程在访问不同对象实例时是否共享数据？
 * <p>
 * Date: 2014-6-29 8:00 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
public class ThreadScopeShareData {

    /**
     * 传递数据的容器，map的key为线程对象
     */
    private static Map<Thread, Integer> threadData = new HashMap<Thread, Integer>();

    /**
     * 有几个线程就会有几份数据：
     * 多个相对访问同一个线程的数据是一样的
     * 不同线程的数据是不同的
     *
     * @param args
     */
    public static void main(String[] args) {
        new Thread(new InThread(), "InThread0: ").start();
        new Thread(new InThread(), "InThread1: ").start();

    }


    static class InThread implements Runnable {

        @Override
        public void run() {
            int data = new Random().nextInt();
            //把数据放入MAP
            threadData.put(Thread.currentThread(), data);

            System.out.println(Thread.currentThread().getName() + " has put data :" + data);
            // 线程去访问 A
            new ObjectA().get();
            // 线程去访问 B
            new ObjectB().get();
        }
    }


    /**
     * 模块A
     */
    static class ObjectA {
        public void get() {
            //从线程获取数据
            int data = threadData.get(Thread.currentThread());
            System.out.println("ObjectA from " + Thread.currentThread().getName() + " get data :" + data);
        }
    }

    /**
     * 模块B
     */
    static class ObjectB {
        public void get() {
            //从线程获取数据
            int data = threadData.get(Thread.currentThread());
            System.out.println("ObjectB from " + Thread.currentThread().getName() + " get data :" + data);
        }
    }
}
